I was writing an email at work one day, but got to thinking – is this too wordy? I finally remembered that prose readability is often measured with something called a "fog index" (how foggy is your writing?)
A search on Google turned up Merlyn's article "Discovering incomprehensible documentation" for his Nov 2000 Linux Magazine column. His article describes "fog indexing" his manpages using Lingua::EN::Fathom (one of the wonders of CPAN), a module for computing the fog index of a piece of text. But I wanted something more – a simple, general-purpose utility.
So, here is "fog", a simple command-line program for discovering the fog index of text. fog (a thin, tasty wrapper around Lingua::EN::Fathom) can work on either a string, standard input, or a set of files. It is a little rough around the edges, so any suggestions are welcomed.
Here is the source for fog:
#!/usr/bin/perl -w
# List various measures of readability -- "fog indexes".
#
# Just a thin, tasty wrapper around Lingua::EN::Fathom.
# ------ pragmas
use warnings;
use strict;
use Lingua::EN::Fathom;
# ------ variables
my $file_count = 0; # count of files to analyze
my $file_name = ""; # current filename
my $fog_index = ""; # fog indexing object (a Lingua::EN::Fathom)
my $ifh = undef; # input file handle
my $input = ""; # string to analyze
my @input = ""; # array of strings to analyze
my $more_files = 0; # TRUE when more than one file to analyze
# ------ process command-line arguments
if (@ARGV < 1) {
die "usage: fog -|-f FILE1 ...|STRING\n"
}
if ($ARGV[0] eq "-") {
no strict 'subs';
$ifh = *STDIN;
@input = <$ifh>;
$input = join("\n", @input);
$file_count = 1;
use strict;
} elsif ($ARGV[0] eq "-f" && @ARGV >= 2) {
$file_count = scalar(@ARGV) - 1;
if ($file_count > 1) {
$more_files++;
}
shift;
open($ifh, $ARGV[0]) || die "cannot open $ARGV[0]: $!\n";
@input = <$ifh>;
close($ifh);
$input = join("\n", @input);
$file_name = $ARGV[0];
} else {
$input = $ARGV[0];
$file_count = 1;
}
while ($file_count > 0) {
$fog_index = new Lingua::EN::Fathom;
$fog_index->analyse_block($input, 1);
if ($more_files > 0) {
print $file_name, ":\n";
}
print $fog_index->report, "\n";
$file_count--;
if ($file_count > 0) {
shift;
$file_name = $ARGV[0];
open($ifh, $file_name) || die "cannot open $file_name: $!\n";
@input = <$ifh>;
close($ifh);
$input = join("\n", @input);
}
}